#include <cqueue.h>

#include <cstdio>
#include <cstdlib>


Status CQueue_Init(CQLink &Q) {
    Q = (CQLink) malloc(sizeof(CQLink));

    if (!Q) return ERROR;

    Q->data = NULL;
    Q->next = Q;

    return OK;
}


Status CQueue_In(CQLink &Q, QElemType e) {
    CQLink p = (CQLink) malloc(sizeof(CQNode));

    p->data = e;
    p->next = Q->next;
    Q->next = p;
    Q = p;

    return OK;
}

Status CQueue_Out(CQLink &Q, QElemType &e) {
    if (Q->next == Q) {
        return ERROR;
    }

    CQLink front = Q->next;  // 头结点
    CQLink p = front->next; // 第一个数据节点

    e = p->data;

    if (p == Q) {
        // 如果只有一个元素
        front->next = front;
        Q = front;
        free(p);
    } else {
        // 一般情况下直接头结点下一个等于 p 的下一个
        front->next = p->next;
        free(p);
    }

    return OK;
}


Status CQueue_Display(CQLink Q) {
    CQLink p = Q->next->next;

    int first = 1;
    while (p != Q) {
        if (first) {
            first = 0;
            printf("队首|");
        } else {
            printf("<==");
        }
        printf("%d", p->data);
        p = p->next;
    }
    printf("<==");
    printf("%d", p->data);
    printf("|队尾");


    return OK;
}
